﻿using Ionic.Zip;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SilverlightFileUploader.Web
{
    public partial class TestPage : System.Web.UI.Page
    {
        protected string _sandbox;


        protected void Page_Load(object sender, EventArgs e)
        {
           //befülle die DropDownListe
            if (DropDownList1.Text == String.Empty)
            {
                var di = new DirectoryInfo(Server.MapPath("~/Backup/"));
                foreach (var fi in di.GetFiles())
                {
                    DropDownList1.Items.Add(fi.Name);
                }
            }

            //prüfe auf inaktive Studenten
            checkInactive();


        }

        protected void button2_Click(object sender, EventArgs e)
        {
            DirectoryInfo dir = new DirectoryInfo(Server.MapPath("~/Upload/"));
            try
            {
                AnalyseFrom(dir.GetFiles().First().FullName);
                button2.Enabled = false;
            }
            catch 
            {
                Label3.Text = "Fehler: Keine Datei hochgeladen!";
            }

        }

        List<string> completefiles = new List<string>()
            {
                "flex_fachgruppe_komplett.csv" , "flex_prfbem_komplett.csv" , "flex_prffach_komplett.csv" ,
                "flex_prffachver_komplett.csv" , "flex_semester_komplett.csv" , "flex_studab_komplett.csv" , 
                "flex_studabver_komplett.csv", "flex_studfach_komplett.csv" , "flex_teilprf_komplett.csv"
            };

        List<string> updatefiles = new List<string>()
            {
               "flex_prfstd_update.csv" , "flex_studenfach_sem_update.csv" ,
               "flex_student_update.csv" 
            };


        protected void button3_Click(object sender, EventArgs e)
        {
            BackUp();

            //alte Backup-Datei löschen
            var backupdi = new DirectoryInfo(Server.MapPath("~/Backup/"));
            foreach (var fi in backupdi.GetFiles())
            {
                if (completefiles.Contains(fi.Name) || (updatefiles.Contains(fi.Name)))
                {
                    fi.Delete();
                }
            }

            ImportFrom(Server.MapPath("~/Analyzing/"));

            button3.Enabled = false;

        }

        protected void Button4_Click(object sender, EventArgs e)
        {
            if (DropDownList1.SelectedValue == String.Empty)
            {
                Label3.Text = "Keine Backup-Datei ausgewählt!"; 
            } else

            {
            AnalyseFrom(Server.MapPath("~/Backup/") + DropDownList1.SelectedValue.ToString());
            ImportFrom(Server.MapPath("~/Analyzing/"));
            button2.Enabled = false;
            Label4.Text = "Backup erfolgreich importiert!";
            Label5.Text = "";
            }
        }

        protected void Button5_Click(object sender, EventArgs e)
        {
            Response.Redirect("http://msv-3188.sb.dfki.de/Pivotbrowser/#/Browse");
        }

        protected void Button6_Click(object sender, EventArgs e)
        {
            Response.Redirect(Request.RawUrl);
        }

        protected void Button7_Click(object sender, EventArgs e)
        {
            String ConnectionCredentials = @"Data Source=msv-3188.sb.dfki.de\SQLEXPRESS;
                                             Initial Catalog=IWISQL;
                                             Persist Security Info=True;
                                             User ID=uid;   
                                             Password=wp9knr";

            SqlConnection con = new SqlConnection(ConnectionCredentials);

            con.Open();

            string deleteInactive = "DELETE FROM dbo.flex_student WHERE MATRNR IN (SELECT DISTINCT (MATRNR) as Count FROM dbo.flex_student WHERE MATRNR NOT IN (SELECT DISTINCT dbo.flex_student.MATRNR FROM dbo.flex_student INNER JOIN dbo.flex_studenfach_sem ON dbo.flex_student.MATRNR = dbo.flex_studenfach_sem.MATRNR WHERE SEMESTERNR IN (SELECT DISTINCT TOP 3 SEMESTERNR FROM dbo.flex_studenfach_sem ORDER BY SEMESTERNR DESC)))";
            string deleteTests = "DELETE FROM dbo.flex_prfstd WHERE MATRNR IN (SELECT DISTINCT (MATRNR) as Count FROM dbo.flex_student WHERE MATRNR NOT IN (SELECT DISTINCT dbo.flex_student.MATRNR FROM dbo.flex_student INNER JOIN dbo.flex_studenfach_sem ON dbo.flex_student.MATRNR = dbo.flex_studenfach_sem.MATRNR WHERE SEMESTERNR IN (SELECT DISTINCT TOP 3 SEMESTERNR FROM dbo.flex_studenfach_sem ORDER BY SEMESTERNR DESC)))";

            SqlCommand command = new SqlCommand(deleteInactive, con);
            SqlCommand command2 = new SqlCommand(deleteTests, con);
            var reader2 = command2.ExecuteReader();
            reader2.Close();

            var reader = command.ExecuteReader();
            reader.Close();
            con.Close();

            Label6.Text = "Es wurden "+ reader.RecordsAffected +" Studenten erfolgreich gelöscht!";
        }


        //analyse
        private void AnalyseFrom(string str)
        {

            var di = new DirectoryInfo(Server.MapPath("~/Analyzing/"));

            // clean up folder
            foreach (var fi in di.GetFiles())
            {
                fi.Delete();
            }

                // decompress new files
                using (ZipFile zip = new ZipFile(str))
                {
                    if (zip.EntryFileNames.All(x => x.ToUpper().EndsWith(".CSV")))
                    {
                        zip.ExtractAll(Server.MapPath("~/Analyzing/"));
                        Label3.Text = "Dateien erfolgreich extrahiert. Analysiere Tabellen...";
                    }
                    else
                    {
                        Label3.Text = "Die .zip-Datei darf nur .csv-Dateien enthalten!";
                    }
                }

                //analyze file names
                List<string> possiblefiles = new List<string>()
            {
                "flex_fachgruppe_komplett.csv" , "flex_prfbem_komplett.csv" , "flex_prffach_komplett.csv" ,
                "flex_prffachver_komplett.csv" , "flex_prfstd_update.csv" , "flex_semester_komplett.csv" ,
                "flex_studab_komplett.csv" , "flex_studabver_komplett.csv" , "flex_studenfach_sem_update.csv" ,
                "flex_student_update.csv" , "flex_studfach_komplett.csv" , "flex_teilprf_komplett.csv"
            };

                bool error = false;

                foreach (var fi in di.GetFiles())
                {
                    if (possiblefiles.Contains(fi.Name))
                    {
                        possiblefiles.Remove(fi.Name);
                    }
                    else
                    {
                        error = true;
                        Label4.Text = "Unpassende oder doppelte Datei: " + fi.Name;
                        button3.Enabled = false;
                        break;
                    }
                }

                if (!error)
                {
                    Label4.Text = "Keine Fehler. 'Import' drücken um den Vorgang zu starten.";
                    button3.Visible = true;
                    button3.Enabled = true;
                    var dir = new DirectoryInfo(Server.MapPath("~/Upload/"));

                    // clean up folder
                    foreach (var fi in dir.GetFiles())
                    {
                        fi.Delete();
                    }
                }
         
        }

        //import
        private void ImportFrom(string str)
        {
            String ConnectionCredentials = @"Data Source=msv-3188.sb.dfki.de\SQLEXPRESS;
                                             Initial Catalog=IWISQL;
                                             Persist Security Info=True;
                                             User ID=uid;   
                                             Password=wp9knr";

            SqlConnection con = new SqlConnection(ConnectionCredentials);

            var di = new DirectoryInfo(str);

            foreach (var fi in di.GetFiles())
            {
                try
                {
                    con.Open();
                }
                catch
                {
                    Label3.Text = "Fehler: Keine Verbindung zur Datenbank";
                    Label4.Text = "";
                    return;
                }
                
                string filepath = str + fi.ToString();

                StreamReader sr = new StreamReader(filepath, System.Text.Encoding.GetEncoding("iso-8859-1"), true);
                string line = sr.ReadLine();
                string[] value = line.Split(';');
                DataTable dt = new DataTable();
                DataRow row;
                foreach (string dc in value)
                {
                    dt.Columns.Add(new DataColumn(dc));
                }

                while (!sr.EndOfStream)
                {
                    value = sr.ReadLine().Split(';');
                    if (value.Length == dt.Columns.Count)
                    {
                        row = dt.NewRow();
                        row.ItemArray = value;
                        dt.Rows.Add(row);
                    }
                }

                SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
                bc.BulkCopyTimeout = 120;

                //unterscheide zwischen update und complete Dateien!
                if (completefiles.Contains(fi.Name))
                {
                    //lösche Tabelle
                    //hier werden die Zeichen ".csv" entfernt um den Table zu identifizieren...
                    string delete = "DELETE FROM " + "dbo." + fi.Name.ToString().Remove(fi.Name.Length - 13, 13);
                    SqlCommand command = new SqlCommand(delete, con);
                    command.ExecuteReader();

                    bc.DestinationTableName = "dbo." + fi.Name.ToString().Remove(fi.Name.Length - 13, 13);

                    bc.BatchSize = dt.Rows.Count;
                    bc.WriteToServer(dt);
                    sr.Dispose();
                    bc.Close();
                }
                else
                //sicherstellen der UPDATE Funktion bei import schon vorhandener Daten
                {
                    string tablename = "dbo." + fi.Name.ToString().Remove(fi.Name.Length - 11, 11) + "_dummy";
                    bc.DestinationTableName = tablename;

                    bc.BatchSize = dt.Rows.Count;
                    bc.WriteToServer(dt);
                    sr.Dispose();
                    bc.Close();

                    //unterscheide INPUT-TAbellen: 
                    string merge = "";

                    switch (tablename)
                    {
                        case "dbo.flex_student_dummy":
                            merge = "MERGE INTO dbo.flex_student as s USING dbo.flex_student_dummy as sd ON (s.MATRNR = sd.MATRNR) WHEN MATCHED THEN UPDATE SET   VORNAME = sd.VORNAME,  NACHNAME = sd.NACHNAME, SEX=sd.SEX, NUTZER=sd.NUTZER, ORT1=sd.ORT1, STRASSE1=sd.STRASSE1, VERMIETER1=sd.VERMIETER1, GEBDAT=sd.GEBDAT, PASSWORT=sd.PASSWORT, PASSWORTAKTIV=sd.PASSWORTAKTIV, GORT=sd.GORT, GNAME=sd.GNAME, GDATUM=sd.GDATUM, EMAIL=sd.EMAIL, PLZ1=sd.PLZ1, ZEITSTEMPEL=sd.ZEITSTEMPEL, TELEFON1=sd.TELEFON1, TELEFON2=sd.TELEFON2, ORT2=sd.ORT2, STRASSE2=sd.STRASSE2, VERMIETER2=sd.VERMIETER2, PLZ2=sd.PLZ2, POSTADRESSE=sd.POSTADRESSE, LAND=sd.LAND, LAND1=sd.LAND1, LAND2=sd.LAND2, HOMEVERZEICHNIS=sd.HOMEVERZEICHNIS, AKADGRAD=sd.AKADGRAD, UNIV=sd.UNIV, MATRNRSTR=sd.MATRNRSTR, BAFOEG=sd.BAFOEG, NUTZERNAME=sd.NUTZERNAME, ANZAHLTAN=sd.ANZAHLTAN, PASSWORTAENDERN=sd.PASSWORTAENDERN, PASSWORTDATUM=sd.PASSWORTDATUM, NDSNUTZER=sd.NDSNUTZER, NAMENSZUSATZ=sd.NAMENSZUSATZ, FREISCHALTUNG=sd.FREISCHALTUNG, GLAND=sd.GLAND, HZB_NOTE=sd.HZB_NOTE, HZB_ART=sd.HZB_ART, PERSONID=sd.PERSONID, ANZAHLPASSWORT=sd.ANZAHLPASSWORT, ORGEINHEIT=sd.ORGEINHEIT, NACHNAMEASCII=sd.NACHNAMEASCII, MENTOR=sd.MENTOR, UNIVMATRNR=sd.UNIVMATRNR, REGID=sd.REGID, GASTHOERER=sd.GASTHOERER, STUDFACH=sd.STUDFACH, TUTOR=sd.TUTOR, PASSWORT_TEMP=sd.PASSWORT_TEMP, HSSTATUS=sd.HSSTATUS, ANDEREPERSON=sd.ANDEREPERSON, PFRAGE=sd.PFRAGE, PFANTWORT=sd.PFANTWORT, STUDIENFACH=sd.STUDIENFACH, ABSCHLUSS=sd.ABSCHLUSS, MAIL_LOCK=sd.MAIL_LOCK, EMAIL2=sd.EMAIL2, NOTE_ERLAUBT=sd.NOTE_ERLAUBT, PWDOLD=sd.PWDOLD, PLUSKONZEPT=sd.PLUSKONZEPT, ZERTBEANTRAGT=sd.ZERTBEANTRAGT, NACHTEILAKTIV=sd.NACHTEILAKTIV, NACHTEILOFFEN=sd.NACHTEILOFFEN, NACHTEILART=sd.NACHTEILART, TANSBEKOMMEN=sd.TANSBEKOMMEN   WHEN NOT MATCHED THEN INSERT (MATRNR, VORNAME, NACHNAME, SEX, NUTZER, ORT1, STRASSE1, VERMIETER1, GEBDAT, PASSWORT, PASSWORTAKTIV, GORT, GNAME, GDATUM, EMAIL, PLZ1, ZEITSTEMPEL, TELEFON1, TELEFON2, ORT2, STRASSE2, VERMIETER2, PLZ2, POSTADRESSE, LAND, LAND1, LAND2, HOMEVERZEICHNIS, AKADGRAD, UNIV, MATRNRSTR, BAFOEG, NUTZERNAME, ANZAHLTAN, PASSWORTAENDERN, PASSWORTDATUM, NDSNUTZER, NAMENSZUSATZ, FREISCHALTUNG, GLAND, HZB_NOTE, HZB_ART, PERSONID, ANZAHLPASSWORT, ORGEINHEIT, NACHNAMEASCII, MENTOR, UNIVMATRNR, REGID, GASTHOERER, STUDFACH, TUTOR, PASSWORT_TEMP, HSSTATUS, ANDEREPERSON, PFRAGE, PFANTWORT, STUDIENFACH, ABSCHLUSS, MAIL_LOCK, EMAIL2, NOTE_ERLAUBT, PWDOLD, PLUSKONZEPT, ZERTBEANTRAGT, NACHTEILAKTIV, NACHTEILOFFEN, NACHTEILART, TANSBEKOMMEN ) VALUES  (MATRNR, VORNAME, NACHNAME, SEX, NUTZER, ORT1, STRASSE1, VERMIETER1, GEBDAT, PASSWORT, PASSWORTAKTIV, GORT, GNAME, GDATUM, EMAIL, PLZ1, ZEITSTEMPEL, TELEFON1, TELEFON2, ORT2, STRASSE2, VERMIETER2, PLZ2, POSTADRESSE, LAND, LAND1, LAND2, HOMEVERZEICHNIS, AKADGRAD, UNIV, MATRNRSTR, BAFOEG, NUTZERNAME, ANZAHLTAN, PASSWORTAENDERN, PASSWORTDATUM, NDSNUTZER, NAMENSZUSATZ, FREISCHALTUNG, GLAND, HZB_NOTE, HZB_ART, PERSONID, ANZAHLPASSWORT, ORGEINHEIT, NACHNAMEASCII, MENTOR, UNIVMATRNR, REGID, GASTHOERER, STUDFACH, TUTOR, PASSWORT_TEMP, HSSTATUS, ANDEREPERSON, PFRAGE, PFANTWORT, STUDIENFACH, ABSCHLUSS, MAIL_LOCK, EMAIL2, NOTE_ERLAUBT, PWDOLD, PLUSKONZEPT, ZERTBEANTRAGT, NACHTEILAKTIV, NACHTEILOFFEN, NACHTEILART, TANSBEKOMMEN);";
                            break;
                        case "dbo.flex_prfstd_dummy":
                            merge = "MERGE INTO dbo.flex_prfstd as s USING dbo.flex_prfstd_dummy as sd ON (s.MATRNR = sd.MATRNR AND s.PRFFACH = sd.PRFFACH AND s.TEILPRF = sd.TEILPRF AND s.SEMESTERNR = sd.SEMESTERNR AND s.STUDFACH = sd.STUDFACH AND s.STUDAB = sd.STUDAB AND s.STUDABVER = sd.STUDABVER AND s.FACHGRUPPE = sd.FACHGRUPPE AND s.PRFFACHVER = sd.PRFFACHVER AND s.TERMINNR = sd.TERMINNR AND s.PRFANG = sd.PRFANG) WHEN MATCHED THEN UPDATE SET  STUDENTFACH=sd.STUDENTFACH,MATRNR=sd.MATRNR,STUDFACH=sd.STUDFACH,STUDAB=sd.STUDAB,STUDABVER=sd.STUDABVER,FACHGRUPPE=	sd.FACHGRUPPE,PRFFACH=sd.PRFFACH,PRFFACHVER=sd.PRFFACHVER,TEILPRF=sd.TEILPRF,SEMESTERNR=sd.SEMESTERNR,TERMINNR=sd.TERMINNR,PRFANG=sd.PRFANG,ANMELDUNG=	sd.ANMELDUNG,PUNKTE=sd.PUNKTE,NOTE_=sd.NOTE_,FV=sd.FV,KORREKTUR=sd.KORREKTUR,NOTEDATUM=sd.NOTEDATUM,NOTEUSER=sd.NOTEUSER,NOTEZEIT=sd.NOTEZEIT,ANZAHL=sd.ANZAHL,PRFBEM=sd.PRFBEM,NEUANTRITT=sd.NEUANTRITT,ID_TA=	sd.ID_TA,VORBEHALT=sd.VORBEHALT,PNR=sd.PNR,NUTZER=sd.NUTZER,ZEITSTEMPEL=sd.ZEITSTEMPEL,ANERK_DURCH=sd.ANERK_DURCH,ANERK_HOCHSCHULE=	sd.ANERK_HOCHSCHULE,ANERK_DATUM=sd.ANERK_DATUM,VLGRUPPE=sd.VLGRUPPE,VLG=sd.VLG,LFDNR=sd.LFDNR,KONTOTYP=sd.KONTOTYP,LOGIN_=sd.LOGIN_,WWWFREIGABE=sd.WWWFREIGABE,PRFDATUM=sd.PRFDATUM,PRFBEGINN=sd.PRFBEGINN,PRFENDE=sd.PRFENDE,PRUEFERWAHL=sd.PRUEFERWAHL,TITEL=sd.TITEL,ABGABE=sd.ABGABE,STUDFACH_QUELLE=sd.STUDFACH_QUELLE,STUDAB_QUELLE=sd.STUDAB_QUELLE,STUDABVER_QUELLE=sd.STUDABVER_QUELLE,FACHGRUPPE_QUELLE=sd.FACHGRUPPE_QUELLE,PRFFACH_QUELLE=sd.PRFFACH_QUELLE,PRFFACHVER_QUELLE=	sd.PRFFACHVER_QUELLE,TEILPRF_QUELLE=sd.TEILPRF_QUELLE,SEMESTERNR_QUELLE=	sd.SEMESTERNR_QUELLE,TERMINNR_QUELLE=sd.TERMINNR_QUELLE,PRFANG_QUELLE=sd.PRFANG_QUELLE,FREIGABEDATUM=sd.FREIGABEDATUM,ZEUGNISTYP=sd.ZEUGNISTYP,POSITION=sd.POSITION,ANTRAGDATUM=sd.ANTRAGDATUM,GEBUCHT=sd.GEBUCHT,NOTESORT2=sd.NOTESORT2,FOLGEKONTOTYP=sd.FOLGEKONTOTYP,GEBUCHTANTEIL=sd.GEBUCHTANTEIL,NOTESORT=sd.NOTESORT,PPUNKTE=sd.PPUNKTE,DEFINITIV=sd.DEFINITIV,DOPPELANRECHNUNG=sd.DOPPELANRECHNUNG,KOMPZEUGNIS=sd.KOMPZEUGNIS,KOMPPOSITION=sd.KOMPPOSITION,ISINNOTE=sd.ISINNOTE,ABGABEREAL=sd.ABGABEREAL,VERLAENGERUNG=sd.VERLAENGERUNG,PRAXIS=sd.PRAXIS,EVAL=sd.EVAL,EVALCODE=sd.EVALCODE,VOLUMEN_STD=sd.VOLUMEN_STD,ZEUGNISVOL=sd.ZEUGNISVOL,KOMPZEUGNISVOL=sd.KOMPZEUGNISVOL,ZUSATZINFO=sd.ZUSATZINFO,ECTSGRADE=sd.ECTSGRADE,RANG=sd.RANG,TPG=sd.TPG,ISINDRUCK=sd.ISINDRUCK,VERSAND=sd.VERSAND,KORREKTURSOLL=sd.KORREKTURSOLL,KORREKTURVERL=sd.KORREKTURVERL,KORREKTURREAL=sd.KORREKTURREAL,UNTERBRECHUNG=sd.UNTERBRECHUNG,KOMPZEUGINDRUCK=sd.KOMPZEUGINDRUCK,KOMPZEUGINNOTE=sd.KOMPZEUGINNOTE,SCHREIBRECHT=sd.SCHREIBRECHT,ZAUSNAHME=sd.ZAUSNAHME,TEILPRFART=sd.TEILPRFART,MAILPUSH_SENT=sd.MAILPUSH_SENT WHEN NOT MATCHED THEN INSERT (STUDENTFACH,MATRNR,STUDFACH,STUDAB,STUDABVER,FACHGRUPPE,PRFFACH,PRFFACHVER,TEILPRF,SEMESTERNR,TERMINNR,PRFANG,ANMELDUNG,PUNKTE,NOTE_,FV,KORREKTUR,NOTEDATUM,NOTEUSER,NOTEZEIT,ANZAHL,PRFBEM,NEUANTRITT,ID_TA,VORBEHALT,PNR,NUTZER,ZEITSTEMPEL,ANERK_DURCH,ANERK_HOCHSCHULE,ANERK_DATUM,VLGRUPPE,VLG,LFDNR,KONTOTYP,LOGIN_,WWWFREIGABE,PRFDATUM,PRFBEGINN,PRFENDE,PRUEFERWAHL,TITEL,ABGABE,STUDFACH_QUELLE,STUDAB_QUELLE,STUDABVER_QUELLE,FACHGRUPPE_QUELLE,PRFFACH_QUELLE,PRFFACHVER_QUELLE,TEILPRF_QUELLE,SEMESTERNR_QUELLE,TERMINNR_QUELLE,PRFANG_QUELLE,FREIGABEDATUM,ZEUGNISTYP,POSITION,ANTRAGDATUM,GEBUCHT,NOTESORT2,FOLGEKONTOTYP,GEBUCHTANTEIL,NOTESORT,PPUNKTE,DEFINITIV,DOPPELANRECHNUNG,KOMPZEUGNIS,KOMPPOSITION,ISINNOTE,ABGABEREAL,VERLAENGERUNG,PRAXIS,EVAL,EVALCODE,VOLUMEN_STD,ZEUGNISVOL,KOMPZEUGNISVOL,ZUSATZINFO,ECTSGRADE,RANG,TPG,ISINDRUCK,VERSAND,KORREKTURSOLL,KORREKTURVERL,KORREKTURREAL,UNTERBRECHUNG,KOMPZEUGINDRUCK,KOMPZEUGINNOTE,SCHREIBRECHT,ZAUSNAHME,TEILPRFART,MAILPUSH_SENT) VALUES (STUDENTFACH,MATRNR,STUDFACH,STUDAB,STUDABVER,FACHGRUPPE,PRFFACH,PRFFACHVER,TEILPRF,SEMESTERNR,TERMINNR,PRFANG,ANMELDUNG,PUNKTE,NOTE_,FV,KORREKTUR,NOTEDATUM,NOTEUSER,NOTEZEIT,ANZAHL,PRFBEM,NEUANTRITT,ID_TA,VORBEHALT,PNR,NUTZER,ZEITSTEMPEL,ANERK_DURCH,ANERK_HOCHSCHULE,ANERK_DATUM,VLGRUPPE,VLG,LFDNR,KONTOTYP,LOGIN_,WWWFREIGABE,PRFDATUM,PRFBEGINN,PRFENDE,PRUEFERWAHL,TITEL,ABGABE,STUDFACH_QUELLE,STUDAB_QUELLE,STUDABVER_QUELLE,FACHGRUPPE_QUELLE,PRFFACH_QUELLE,PRFFACHVER_QUELLE,TEILPRF_QUELLE,SEMESTERNR_QUELLE,TERMINNR_QUELLE,PRFANG_QUELLE,FREIGABEDATUM,ZEUGNISTYP,POSITION,ANTRAGDATUM,GEBUCHT,NOTESORT2,FOLGEKONTOTYP,GEBUCHTANTEIL,NOTESORT,PPUNKTE,DEFINITIV,DOPPELANRECHNUNG,KOMPZEUGNIS,KOMPPOSITION,ISINNOTE,ABGABEREAL,VERLAENGERUNG,PRAXIS,EVAL,EVALCODE,VOLUMEN_STD,ZEUGNISVOL,KOMPZEUGNISVOL,ZUSATZINFO,ECTSGRADE,RANG,TPG,ISINDRUCK,VERSAND,KORREKTURSOLL,KORREKTURVERL,KORREKTURREAL,UNTERBRECHUNG,KOMPZEUGINDRUCK,KOMPZEUGINNOTE,SCHREIBRECHT,ZAUSNAHME,TEILPRFART,MAILPUSH_SENT);";
                            break;
                        case "dbo.flex_studenfach_sem_dummy":
                            merge = "MERGE INTO dbo.flex_studenfach_sem as s USING dbo.flex_studenfach_sem_dummy as sd ON (s.MATRNR = sd.MATRNR AND s.STUDFACH = sd.STUDFACH AND s.SEMESTERNR = sd.SEMESTERNR) WHEN MATCHED THEN UPDATE SET  MATRNR = sd.MATRNR,STUDFACH = sd.STUDFACH,SEMESTERNR = sd.SEMESTERNR,FACHSEM = sd.FACHSEM,PRFSEM = sd.PRFSEM,SEMESTERTYP = sd.SEMESTERTYP,EDITED = sd.EDITED,IMMASEM = sd.IMMASEM,IMMADATUM = sd.IMMADATUM,EXMASEM = sd.EXMASEM,EXMADATUM = sd.EXMADATUM,UNIV =	sd.UNIV,TEILZEIT = sd.TEILZEIT,SEMANTEIL = sd.SEMANTEIL,SEMGEWICHTET = sd.SEMGEWICHTET,ABSCHL_ANG = sd.ABSCHL_ANG WHEN NOT MATCHED THEN INSERT (MATRNR,STUDFACH,SEMESTERNR,FACHSEM,PRFSEM,SEMESTERTYP,EDITED,IMMASEM,IMMADATUM,EXMASEM,EXMADATUM,UNIV,TEILZEIT,SEMANTEIL,SEMGEWICHTET,ABSCHL_ANG)VALUES  (MATRNR,STUDFACH,SEMESTERNR,FACHSEM,PRFSEM,SEMESTERTYP,EDITED,IMMASEM,IMMADATUM,EXMASEM,EXMADATUM,UNIV,TEILZEIT,SEMANTEIL,SEMGEWICHTET,ABSCHL_ANG);";
                            break;
                    }

                    SqlCommand command = new SqlCommand(merge, con);
                    command.ExecuteReader();

                    con.Close();
                    con.Open();

                    string delete = "DELETE FROM " + "dbo." + fi.Name.ToString().Remove(fi.Name.Length - 11, 11) + "_dummy";
                    SqlCommand command2 = new SqlCommand(delete, con);
                    command2.ExecuteReader();

                }

                Label4.Text = "";
                Label5.Text = Label5.Text + "<br />Datei " + fi.Name + " erfolgreich importiert!";

                con.Close();

            }

        }

        //backup
        private void BackUp()
        {
            //stelle Verbindung zur DB her
            String ConnectionCredentials = @"Data Source=msv-3188.sb.dfki.de\SQLEXPRESS;
                                             Initial Catalog=IWISQL;
                                             Persist Security Info=True;
                                             User ID=uid;   
                                             Password=wp9knr";

            SqlConnection con = new SqlConnection(ConnectionCredentials);

            try
            {
                con.Open();
            }
            catch
            {
                Label3.Text = "Fehler: Keine Verbindung zur Datenbank";
                Label4.Text = "";
                return;
            }

            //erfasse Datum für Backup
            DateTime time = DateTime.Now;
            string format = "dd/MM/yyyy-HH.mm";
            string date = time.ToString(format);

            ZipFile zip = new ZipFile();

            var di = new DirectoryInfo(Server.MapPath("~/Analyzing/"));
            foreach (var fi in di.GetFiles())
            {

                //neue Backup-Datei erstellen
                string backuppath = Server.MapPath("~/Backup/") + fi.ToString();
                StreamWriter sw = new StreamWriter(backuppath, false, System.Text.Encoding.GetEncoding("iso-8859-1"));

                SqlDataAdapter da;

                //checke ob complete oder update
                if (completefiles.Contains(fi.Name))
                {
                    da = new SqlDataAdapter("select * from dbo." + fi.ToString().Remove(fi.Name.Length - 13, 13), con);
                }
                else
                {
                    da = new SqlDataAdapter("select * from dbo." + fi.ToString().Remove(fi.Name.Length - 11, 11), con);
                }

                DataSet ds = new DataSet();
                da.Fill(ds, "Emp");
                DataTable bdt = ds.Tables["Emp"];

                // Write the headers.
                int iColCount = bdt.Columns.Count;
                for (int i = 0; i < iColCount; i++)
                {
                    sw.Write(bdt.Columns[i]);
                    if (i < iColCount - 1) sw.Write(";");
                }

                sw.Write(sw.NewLine);

                // Write rows.
                foreach (DataRow dr in bdt.Rows)
                {
                    for (int i = 0; i < iColCount; i++)
                    {
                        if (!Convert.IsDBNull(dr[i]))
                        {
                            if (dr[i].ToString().StartsWith("0"))
                            {
                                sw.Write(@"=""" + dr[i] + @"""");
                            }
                            else
                            {
                                sw.Write(dr[i].ToString());
                            }
                        }

                        if (i < iColCount - 1) sw.Write(";");
                    }
                    sw.Write(sw.NewLine);
                }

                sw.Dispose();
                sw.Close();

                zip.AddFile(Server.MapPath("~/Backup/" + fi.Name), "");

            }

            Label3.Text = "Backup erstellt in: ~/Backup/backup." + date + ".zip";

            //Zip-Archiv erstellen
            zip.Save(Server.MapPath("~/Backup/backup." + date + ".zip"));

            //Begrenzung auf 5 backup-Files
            var Bdi = new DirectoryInfo(Server.MapPath("~/Backup/"));
            var numberBackups = Bdi.GetFiles().Length;

            if (numberBackups > 5)
            {
                var deletefile = Bdi.GetFileSystemInfos().OrderByDescending(de => de.CreationTime).Last();
                deletefile.Delete();
            }


            con.Close();

        }

        // Inaktive abfragen
        private void checkInactive()
        {
            String ConnectionCredentials = @"Data Source=msv-3188.sb.dfki.de\SQLEXPRESS;
                                             Initial Catalog=IWISQL;
                                             Persist Security Info=True;
                                             User ID=uid;   
                                             Password=wp9knr";

            SqlConnection con = new SqlConnection(ConnectionCredentials);

            con.Open();

            string checkQuery = "SELECT DISTINCT COUNT (MATRNR) AS Count FROM dbo.flex_student WHERE MATRNR NOT IN (SELECT DISTINCT dbo.flex_student.MATRNR FROM dbo.flex_student INNER JOIN dbo.flex_studenfach_sem ON dbo.flex_student.MATRNR = dbo.flex_studenfach_sem.MATRNR WHERE SEMESTERNR IN (SELECT DISTINCT TOP 3 SEMESTERNR FROM dbo.flex_studenfach_sem ORDER BY SEMESTERNR DESC))";

            SqlCommand command = new SqlCommand(checkQuery, con);
            var reader = command.ExecuteReader();
            int intQ;

            if (reader.Read())
            {
                intQ = int.Parse(reader[0].ToString());
               
            }
            else
            {
                intQ = 0;
            }

            con.Close();

            if (intQ > 0)
            {
                this.Label6.Text = "Es wurden " + intQ + " Studenten gefunden, die länger nicht mehr aktiv waren. Zum Entfernen dieser Studenten aus der Datenbank bitte den Button 'Inaktive löschen' drücken.";
                Button7.Enabled = true;
            }
            else
            {
                this.Label6.Text = "Es wurden keine inaktiven Studenten gefunden.";
            }
        }

    }

}